package com.sky.myapplication.kotlin.`class`

import android.util.Log

/**
 * Created by Min
 * Date 2023/2/9  14:48
 */

//构造函数 子类有主构造函数
//如果子类有主构造函数， 则基类必须在主构造函数中立即初始化。
//class StudentKotlin(worker: String) : PersonKotlin(worker) {
//}

//子类没有主构造函数
//如果子类没有主构造函数，则必须在每一个二级构造函数中用 super 关键字初始化基类，或者在代理另一个构造函数。初始化基类时，可以调用基类的不同构造方法。
open class StudentKotlin : PersonKotlin, InterfacePersonKotlin{
    //属性重写
    //属性重写使用 override 关键字，属性必须具有兼容类型，每一个声明的属性都可以通过初始化程序或者getter方法被重写：
    //你可以用一个var属性重写一个val属性，但是反过来不行。因为val属性本身定义了getter方法，重写为var属性会在衍生类中额外声明一个setter方法
    override var age: Int = 3

    constructor(name: String) : super(name){

    }

    //重写属性
    override var cloth: String = "My cloth is yaya"

//    重写
//    在基类中，使用fun声明函数时，此函数默认为final修饰，不能被子类重写。如果允许子类重写该函数，那么就要手动添加 open 修饰它, 子类重写方法使用 override 关键词：
    override fun sayName(){
//        super<A>.f()//调用 A.f()
//        super<B>.f()//调用 B.f()
        super<PersonKotlin>.sayName()
        super<InterfacePersonKotlin>.sayName()
        Log.i("mxp", "this is Student sayName")
    }
}